package ar.edu.utn.frsf.tpae.a2013.g04.persistence.dao.impl;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import ar.edu.utn.frsf.tpae.a2013.g04.persistence.dao.SolicitudGastoDAO;
import ar.edu.utn.frsf.tpae.a2013.g04.persistence.model.CentroCosto;
import ar.edu.utn.frsf.tpae.a2013.g04.persistence.model.Empleado;
import ar.edu.utn.frsf.tpae.a2013.g04.persistence.model.SolicitudGasto;

@Component
public class SolicitudGastoDAOHibernate implements SolicitudGastoDAO {

	private SessionFactory  sessionFactory;

	
	@Override
	public SolicitudGasto persistir(SolicitudGasto solicitud) {
		Session session = sessionFactory.getCurrentSession();
	    session.saveOrUpdate(solicitud);
	    return solicitud;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<SolicitudGasto> buscarSolicitudes(Empleado empleado,
			CentroCosto cCosto) {
		Session session = sessionFactory.getCurrentSession();
		Query query = session.createQuery("select sg from " + " SolicitudGasto sg"
		        + " where sg.centroCosto = :cCosto AND sg.empleado = :empleado");
		query.setParameter("empleado", empleado);
		query.setParameter("cCosto", cCosto);
		return (List<SolicitudGasto>) query.list();
		
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<SolicitudGasto> buscarSolicitudes(Empleado empleado) {
		Session session = sessionFactory.getCurrentSession();
		Query query = session.createQuery("select sg from " + " SolicitudGasto sg"
		        + " where sg.empleado = :empleado");
		query.setParameter("empleado", empleado);
		return (List<SolicitudGasto>) query.list();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<SolicitudGasto> buscarSolicitudes(CentroCosto cCosto) {
		Session session = sessionFactory.getCurrentSession();
		Query query = session.createQuery("select sg from " + " SolicitudGasto sg"
		        + " where sg.centroCosto = :cCosto");
		query.setParameter("cCosto", cCosto);
		return (List<SolicitudGasto>) query.list();
	}

	@Override
	public SolicitudGasto buscarSolicitud(Integer id) {
		 Session session = sessionFactory.getCurrentSession();
		    return (SolicitudGasto) session.get(SolicitudGasto.class, id);
		
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<SolicitudGasto> listarPendientes() {
		Session session = sessionFactory.getCurrentSession();
	    Query query = session.createQuery("select sg from " + " SolicitudGasto sg"
	        + " where sg.estado = :estado");
	    query.setParameter("estado", SolicitudGasto.PENDIENTE);
	    return (List<SolicitudGasto>) query.list();

	}

	public SessionFactory getSessionFactory() {
		return sessionFactory;
	}

	@Autowired(required = true)
	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}

}
